﻿/*
 * Criado por SharpDevelop.
 * Usuário: henry
 * Data: 08/06/2011
 * Hora: 11:18
 * 
 * Para alterar este modelo use Ferramentas | Opções | Codificação | Editar Cabeçalhos Padrão.
 */
using System;
using Excel;

namespace GeraPlanilha
{
	/// <summary>
	/// Description of ImportaExcel.
	/// </summary>
	public class ImportaExcel
	{
		private Excel.Application excelApp;/*É uma aplicação do Excel, ou seja, inicia o Excel.*/
		private Excel.Workbook arq_de_tab;/*É o arquivo de trabalho, que pode conter várias planilhas.*/
		private Excel.Worksheet planilha;/*É a planilha de trabalho.*/
		private Excel.Range celulas;/*É um objeto utilizado para selecionar uma ou mais células da planilha e trabalhar com elas.*/
		private bool addplanilha = false;/*Atributo que identifica se deve adicionar planilhas ou, caso falso, inserir a primeira.*/
		
		
		public ImportaExcel()
		{
			try
			{
				excelApp = new Excel.Application();//Inicia o Excel.
				this.arq_de_tab = (Excel.Workbook)excelApp.Workbooks.Add(1);/*Cria um arquivo de trabalho (ainda sem planilhas).*/
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		
		public void NovaPlanilha()
		{
			try
			{
				if (addplanilha)
					planilha = (Excel.Worksheet)this.excelApp.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
				/*Na primeira execução do método ele entrará no 'else', para criar uma nova planilha, a partir da segunda vez ele irá entrar no 'if',
				 *  para adicionar planilhas.
				 * */
				else
				{
					planilha = (Excel.Worksheet)arq_de_tab.Sheets[1];
					addplanilha = true;
				}
			}
			catch (Exception) { }
		}
		
		public void Escrever(int linha, int coluna, string texto)
		{
			/*Aqui temos índices para a linha e para a coluna, que começam em '1', diferente de vetores e coleções, 
			 * onde os índices em geral começam em '0'.
			 * */
			try
			{
				planilha.Cells[linha, coluna] = texto;
			}
			catch (Exception) { }
		}
		
		public void RemoverLinha(string linha)
		{
			/*
			    Nota: Aqui a linha não pode ser passada por um índice. É preciso passar alguma célula que esteja na linha que se deseja deletar.
                            Por exemplo: passando a string "A1" por parâmetro no método irá deletar a primeira linha, e "A2" irá deletar a segunda linha.
			 */
			celulas = planilha.get_Range(linha, Type.Missing).EntireRow;
			celulas.Delete(Excel.XlDeleteShiftDirection.xlShiftUp);
		}
		
		public void Salvar(string filename)
		{
			try
			{
				arq_de_tab.SaveAs(filename, Excel.XlFileFormat.xlExcel7, Type.Missing,
				                   Type.Missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,
				                   Type.Missing, Type.Missing, Type.Missing, Type.Missing);
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}


		public void Sair()
		{
			try
			{
				arq_de_tab.Close(false, "", false);
				excelApp.Quit();
			}
			catch (Exception e)
			{
				throw e;
			}
		}
	}
}
